// 默认情况下，对字符串排序，是按照ASCII的大小比较的，现在，我们提出排序应该忽略大小写，按照字母序排序。
// 要实现这个算法，不必对现有代码大加改动，只要我们能定义出忽略大小写的比较算法就可以：
var arr = ['Google', 'apple', 'Microsoft'];

console.log(arr);
var x = arr.sort(function(a, b) {
    aa = a.toUpperCase();
    bb = b.toLowerCase();
    if (aa < bb)

    {
        return -1;
    }

    if (aa > bb)

    {
        return 1;
    }



    return 0;

})
console.log(x);




// 幸运的是，sort()方法也是一个高阶函数，它还可以接收一个比较函数来实现自定义的排序。

// 要按数字大小排序，我们可以这么写：
var abc = [12, 55, 00, 66, 33, 44, 11]

console.log(abc);
var c = abc.sort(function(x1, x2) {
    if (x1 < x2) {
        return -1;

    }
    if (x1 > x2) {

        return 1;
    }

    return 0;

})


//简单方法
var c = abc.sort(function(x1, x2) {

    return x1 - x2;
})
var c = abc.sort(function(x1, x2) {

    return x2 - x1;
})
console.log(c);

//首字母大写，其余的小写
var arr1 = ['GoaAAogle', 'aPPYple', 'MicroMNoft'];

var a = arr1.map(function(xx) {
    var n = xx.substring(0, 1).toUpperCase();
    var m = xx.substring(1).toLowerCase()
    return n + m;

})
console.log(a);

// sort()方法会直接对Array进行修改，它返回的结果仍是当前Array：

//every

var abc = [12, 55, 00, 66, 33, 44, 11]
console.log(abc.every(function(s) {

    return s.length > 0;
}));



var abc = [12, 55, 00, 66, 33, 44, 11]
var v1 = abc.every(function(s) {

    return s.length > 7;
})

console.log(v1);




var arr1 = ['GoaAAogle', 'aPPYple', 'MicroMNoft'];

var v2 = arr1.every(function(s) {

    return s.toLowerCase() === s
})


console.log(v2);


var arr = ['Apple', 'pear', 'orange'];
console.log(arr.every(function(s) {
    return s.length > 0;
})); // true, 因为每个元素都满足s.length>0


//find

var arr = ['Apple', 'pear', 'orange'];
console.log(arr.find(function(s) {
    return s.toLowerCase() === s
}));


// findIndex
// findIndex()和find()类似，也是查找符合条件的第一个元素，不同之处在于findIndex()会返回这个元素的索引，如果没有找到，返回-1：

'use strict';
var arr = ['Apple', 'pear', 'orange'];
console.log(arr.findIndex(function(s) {
    return s.toLowerCase() === s;
})); // 1, 因为'pear'的索引是1

console.log(arr.findIndex(function(s) {
    return s.toUpperCase() === s;
})); // 找不到大写返回-1

// forEach
// forEach()和map()类似，它也把每个元素依次作用于传入的函数，但不会返回新的数组。forEach()常用于遍历数组，因此，传入的函数不需要返回值：


var arr = ['熊大', '熊二', '光头强'];
arr.forEach(console.log); // 依次打印每个元素



function fc(arr) {

    var sum = function() {
        return arr.reduce(function(x, y) {
            return x + y
        })

    }
    return sum;

}
// 当我们调用fc()时，返回的并不是求和结果，而是求和函数：
var f = fc([1, 2, 51, 556, 66, 3, 4, 5])

console.log(f());
// 调用函数f时，才真正计算求和的结果：


// 在这个例子中，我们在函数lazy_sum中又定义了函数sum，并且，内部函数sum可以引用外部函数lazy_sum的参数和局部变量，
// 当lazy_sum返回函数sum时，
// 相关参数和变量都保存在返回的函数中，这种称为“闭包（Closure）”的程序结构拥有极大的威力。


function count() {
    var arr = [];
    for (var i = 1; i <= 3; i++) {
        arr.push(function() {
            return i * i;
        });
    }
    return arr;
}

var results = count();
var f1 = results[0];
var f2 = results[1];
var f3 = results[2];
console.log(f1());
console.log(f2());
console.log(f3());